//
//  renderer.h
//  V3d_Cocoa
//
//  Created by Y my on 11-4-23.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "Geometry.h"
#import "VolDataDelegate.h"

typedef struct tagRGB
{
	unsigned char r, g, b;
	unsigned char unused; // 为了凑齐8个字节
}RGB;
#define SET_COLOR(color, rr, gg, bb) ((color).r = (rr), (color).g = (gg), (color).b = (bb), (color).unused = 0)

@interface Renderer : NSObject {
	// 数据
	unsigned char**** rawData;
	id <VolDataDelegate> volData;
	unsigned char channelCount;
	
	// 视图
	unsigned short viewWidth, viewHeight; // 视图的宽和高，以像素为单位
	RGB backgroundColor;
	
	// 设置 (只与渲染过程有关, 与数据预处理无关, 故放在这里)
	unsigned char pixelPerEdge;  // Cell的一条边包含的像素数，包括两个顶点。用来控制输出图像的大小。范围为：[2，10]
	unsigned char levelLowBound, levelUpBound; // 色阶的上下界
	
	// 投影时，一开始图像原点始终位于视图原点，再进行一些列变换：
	// 1. 将图像中心移到视图原点
	// 2. 进行旋转及缩放变换
	// 3. 将图像中心移回
	// 4. 根据用户输入将图像移到合适的位置
	Matrix4* matMoveToOri;
	Matrix4* matScale;
	Matrix4* matRotate;
	Matrix4* matMoveBack;
	
	// (x, y, z) * matFinalProj = (x, 0, 0) * matFinalProj + (0, y, 0) * matFinalProj + (0, 0, z) * matFinalProj
	Matrix4* matFinalProj;  // 计算投影数组时的最终转换矩阵
	
	short moveX, moveY; // 最后一步时使用
	
	BOOL hasRotated;
	BOOL hasMoved;
	
	short imageLeft, imageTop;
	unsigned short imageWidth, imageHeight;
	RGB* entireImage; // 包含整幅图像的像素
	
	RGB* viewImage;  // 最终输出的数据，在entireImage的基础上进行了平移和剪裁
}
@property unsigned char pixelPerEdge;
@property unsigned char levelLowBound, levelUpBound;
@property (readonly) RGB* viewImage;


// init ////////////////////////////////////
- (id)initWithViewWidth:(unsigned short)width
				 Height:(unsigned short)height
		BackgroundColor:(RGB)color;
// Transform ///////////////////////////////

// （X, Y）: 旋转轴上一点（另一点始终为原点，旋转轴始终位于xoy平面中），Angle：旋转角度（弧度，逆时针）
- (void)rotateX:(float)x Y:(float)y Angle:(float)angle;

// （X, Y）：平移向量
- (void)translateX:(float)x Y:(float)y;

// 将平移和旋转的效果都复原
- (void)reset;

// setup /////////////////////////////////

- (void)setViewWidth:(unsigned short)width
			  Height:(unsigned short)height
	 BackgroundColor:(RGB)color;

- (void)setVolData:(id <VolDataDelegate>)vData;

// main function ////////////////////////////
- (CGImageRef)proceed; 
- (void)calImageSize;
- (void)clip; // entireImage ->(平移和剪裁)-> viewImage
@end
